#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


#define LOG "log.txt"



int main()
{
  int fd = open(LOG,  O_RDWR|O_CREAT);
  if(fd < 0) perror("open");

  dup2(fd, 1);
  printf("holle bite!\n");

  return 0;

}



//int main()
//{
//    //C库
//    fprintf(stdout, "hello fprintf\n");
//    //系统调用
//    const char *msg = "hello write\n";
//    write(1, msg, strlen(msg)); //+1?
//
//    fork(); //????
//    //当向标准输出文件输出(显示器)时，C缓冲区采用的是行缓冲，当向普通文件(log.txt)中输出的时候，采用的是全缓冲。
//    //在fork创建子进程的时候，父进程的缓冲区的内容还并未被刷新到内核中去，所以子进程要发生写时拷贝！！
//    //那么在父子进程退出的时候，要对缓冲区进行刷新，所以我们也就看到了，在对普通文件进行输出的时候，会有两份的holle fprintf\n  ！！！！！
//
//    return 0;
//}

//每个进程创建的时候都会默认的打开三个文件，标准输入，标准输出，标准错误
//不同的语言，在语言层面上对这三个文件进行了不同的封装，C—FILE结构体
//但是无论如何封装，其必定要包含有fd(文件描述符)，通过fd去调用系统调用接口---open write close...
//int main()
//{
//  umask(0);
//  //重定向输出和输入
//  //close(1);//关闭标准输入文件
//  //close(0);//关闭标准输入文件
//  
//  //int fd = open(LOG, O_WRONLY | O_CREAT | O_APPEND, 0666);//追加重定向，不对目标文件的原始内容进行清空，而在后面继续写入
//  int fd = open(LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
//  //int fd = open(LOG, O_RDONLY);
//  
//  //int a = 0;
//  //int b = 0;
//  //scanf("%d %d", &a, &b);//从log.txt文件中读入，不再是stdin -> 0
//  //printf("%d %d\n", a, b);
//
//  //int cnt = 3;
//  //while(cnt--)
//  //{
//  //  printf("holle,world!\n");//stdout -> 1
//  //}
//  
//  ///////////////////////////////////////////////////////////!!!!!!!!!
//  //进程中，文件描述符的分配规则：在文件描述表中，找最小的没有被使用的元素，分配给新文件
//  dup2(fd ,1);//在重定向输出的时候不建议直接close，而选择直接调用dunp2()函数
//  printf("%d\n", stdin->_fileno);
//  printf("%d\n", stdout->_fileno);
//  printf("%d\n", stderr->_fileno);
//  //
//
//  return 0;
//}
